package com.sysef.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import com.sysef.exception.DAOExcepcion;
import com.sysef.util.ConexionBD;
import com.sysef.modelo.BeanClub;
import com.sysef.modelo.BeanDiaCampo;
import com.sysef.modelo.BeanDiaCampoServicio;
import com.sysef.modelo.BeanEstado;


public class DAODiaCampo extends BaseDAO{

	public BeanDiaCampo obtenerDiaCampoxId(int idDiaCampo) throws DAOExcepcion {
		BeanDiaCampo objBeanDiaCampo = new BeanDiaCampo();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select * from tb_DiaCampo where idDiaCampo =?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idDiaCampo);
			rs = stmt.executeQuery();
			if (rs.next()) {
				objBeanDiaCampo.setIntIdDiaCampo(rs.getInt("idDiaCampo"));
				objBeanDiaCampo.setDtFechaReserva(rs.getDate("fechaReserva"));
				objBeanDiaCampo.setIntNroPersonas(rs.getInt("nroPersonas"));
				objBeanDiaCampo.setDtFechaRegistro(rs.getDate("fechaRegistro"));
				
				//---------CLUB----------------
				//Declaramos una variable que reciba el codigo de club
				Integer intIdClub;
				//Seteamos la variable con lo recibido en la consulta
				intIdClub  = rs.getInt("idClub");
				//Creamos un objeto tipo BeanClub
				BeanClub  objBeanClub = new BeanClub();
				//Seteamos el idClub dentro del objeto.
				objBeanClub.setIntIdClub(intIdClub);
				//Seteamos el objeto para el objBeanDiaCampo
				objBeanDiaCampo.setObjBeanClub(objBeanClub);
				
				
				//---------	ESTADO----------------
				//Declaramos una variable que reciba el codigo del estado
				Integer intIdEstado;
				//Seteamos la variable con lo recibido en la consulta
				intIdEstado  = rs.getInt("idEstado");
				//Creamos un objeto tipo BeanEstado
				BeanEstado  objBeanEstado = new BeanEstado();
				//Seteamos el idEstado dentro del objeto.
				objBeanEstado.setIntIdEstado(intIdEstado);
				//Seteamos el objeto para el objBeanDiaCampo
				objBeanDiaCampo.setObjBeanEstado(objBeanEstado);	
				
				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return objBeanDiaCampo;
	}

	public BeanDiaCampo insertarDiaCampo(BeanDiaCampo objBeanDiaCampo) throws DAOExcepcion, SQLException {
		String query = "insert into tb_DiaCampo(fechaReserva,nroPersonas,fechaRegistro,idClub,idEstado) values (?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		String fechaReserva = "";
		String fechaRegistro = "";
		
		try {
			con = ConexionBD.obtenerConexion();
			
			if (con.getAutoCommit() )
				con.setAutoCommit( false );
			
			// Formateando la Fecha
			if (objBeanDiaCampo.getDtFechaReserva() != null && objBeanDiaCampo.getDtFechaRegistro() != null) {
				java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(
						"yyyy-MM-dd HH:mm:ss");
				 fechaReserva = sdf.format(objBeanDiaCampo.getDtFechaReserva());
				 fechaRegistro= sdf.format(objBeanDiaCampo.getDtFechaRegistro());
			}
						
			stmt = con.prepareStatement(query);
			stmt.setString(1, fechaReserva);
			stmt.setInt(2, objBeanDiaCampo.getIntNroPersonas());
			stmt.setString(3, fechaRegistro);
			stmt.setInt(4, objBeanDiaCampo.getObjBeanClub().getIntIdClub());
			stmt.setInt(5, objBeanDiaCampo.getObjBeanEstado().getIntIdEstado());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			objBeanDiaCampo.setIntIdDiaCampo(id);
						
			//inserto servicios por dia de campo
			
			query = "insert into tb_DiaCampoServicio(idDiaCampo,idServicio,cantPersxServ,obsAdicional) values (?,?,?,?)";
			
			for (BeanDiaCampoServicio objServicioDiaCampo : objBeanDiaCampo.getListObjBeanServicio()) {
				stmt = con.prepareStatement(query);
				stmt.setInt(1, objBeanDiaCampo.getIntIdDiaCampo());
				stmt.setInt(2, objServicioDiaCampo.getIntIdServicio());
				stmt.setInt(3, objServicioDiaCampo.getIntCantPersonasxServ());
				stmt.setString(4, objServicioDiaCampo.getStrObsAdicional());
				int exe = stmt.executeUpdate();
				
				stmt.clearParameters();
				if (exe != 1) {
					throw new SQLException("No se pudo insertar el servicio por dia de campo");
				}
			}

			con.commit();

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			con.rollback();
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return objBeanDiaCampo;
	}

	public void aprobarDiaCampo(int intIdDiaCampo) throws DAOExcepcion {
		String query = "update tb_DiaCampo set idEstado=3 WHERE idDiaCampo=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, intIdDiaCampo);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo aprobar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public Collection<BeanDiaCampo> listar() throws DAOExcepcion {
		Collection<BeanDiaCampo> listBeanDiaCampo = new ArrayList<BeanDiaCampo>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select * from tb_DiaCampo order by fechaReserva";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				BeanDiaCampo objBeanDiaCampo = new BeanDiaCampo();
				objBeanDiaCampo.setIntIdDiaCampo(rs.getInt("idDiaCampo"));
				objBeanDiaCampo.setDtFechaReserva(rs.getDate("fechaReserva"));
				objBeanDiaCampo.setIntNroPersonas(rs.getInt("nroPersonas"));
				objBeanDiaCampo.setDtFechaRegistro(rs.getDate("fechaRegistro"));
				
				//---------CLUB----------------
				//Declaramos una variable que reciba el codigo de club
				Integer intIdClub;
				//Seteamos la variable con lo recibido en la consulta
				intIdClub  = rs.getInt("idClub");
				//Creamos un objeto tipo BeanClub
				BeanClub  objBeanClub = new BeanClub();
				//Seteamos el idClub dentro del objeto.
				objBeanClub.setIntIdClub(intIdClub);
				//Seteamos el objeto para el objBeanDiaCampo
				objBeanDiaCampo.setObjBeanClub(objBeanClub);
				
				
				//---------	ESTADO----------------
				//Declaramos una variable que reciba el codigo del estado
				Integer intIdEstado;
				//Seteamos la variable con lo recibido en la consulta
				intIdEstado  = rs.getInt("idEstado");
				//Creamos un objeto tipo BeanEstado
				BeanEstado  objBeanEstado = new BeanEstado();
				//Seteamos el idEstado dentro del objeto.
				objBeanEstado.setIntIdEstado(intIdEstado);
				//Seteamos el objeto para el objBeanDiaCampo
				objBeanDiaCampo.setObjBeanEstado(objBeanEstado);	
				listBeanDiaCampo.add(objBeanDiaCampo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return listBeanDiaCampo;

	}
}
